package com.apigen.platform.service;

import com.apigen.platform.dto.DatabaseConnectionRequest;
import com.apigen.platform.vo.DatabaseTableVO;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

/**
 * 数据库元数据服务接口
 *
 * @author API Generator Platform
 * @since 2025-10-03
 */
public interface DatabaseMetadataService {

    /**
     * 创建数据库连接
     *
     * @param connectionRequest 连接参数
     * @return 数据库连接
     * @throws SQLException SQL异常
     */
    Connection createConnection(DatabaseConnectionRequest connectionRequest) throws SQLException;

    /**
     * 测试数据库连接
     *
     * @param connectionRequest 连接参数
     * @return 连接测试结果
     */
    Map<String, Object> testConnection(DatabaseConnectionRequest connectionRequest);

    /**
     * 获取数据库中所有表
     *
     * @param connectionRequest 连接参数
     * @return 表列表
     */
    List<DatabaseTableVO> getAllTables(DatabaseConnectionRequest connectionRequest);

    /**
     * 获取指定表的详细信息
     *
     * @param connectionRequest 连接参数
     * @param tableName 表名
     * @return 表详细信息
     */
    DatabaseTableVO getTableDetail(DatabaseConnectionRequest connectionRequest, String tableName);

    /**
     * 获取表的字段信息
     *
     * @param connectionRequest 连接参数
     * @param tableName 表名
     * @return 字段列表
     */
    List<DatabaseTableVO.DatabaseFieldVO> getTableFields(DatabaseConnectionRequest connectionRequest, String tableName);

    /**
     * 获取表的索引信息
     *
     * @param connectionRequest 连接参数
     * @param tableName 表名
     * @return 索引列表
     */
    List<DatabaseTableVO.DatabaseIndexVO> getTableIndexes(DatabaseConnectionRequest connectionRequest, String tableName);

    /**
     * 获取表的主键信息
     *
     * @param connectionRequest 连接参数
     * @param tableName 表名
     * @return 主键字段列表
     */
    List<String> getTablePrimaryKeys(DatabaseConnectionRequest connectionRequest, String tableName);

    /**
     * 获取表的外键信息
     *
     * @param connectionRequest 连接参数
     * @param tableName 表名
     * @return 外键信息
     */
    List<Map<String, Object>> getTableForeignKeys(DatabaseConnectionRequest connectionRequest, String tableName);

    /**
     * 获取数据库信息
     *
     * @param connectionRequest 连接参数
     * @return 数据库信息
     */
    Map<String, Object> getDatabaseInfo(DatabaseConnectionRequest connectionRequest);

    /**
     * 构建JDBC连接URL
     *
     * @param connectionRequest 连接参数
     * @return JDBC URL
     */
    String buildJdbcUrl(DatabaseConnectionRequest connectionRequest);
}
